<template>
  <div class="p-search-form">
    <!-- 默认插槽，可替代list参数 -->
    <slot></slot>
    <template v-for="item in list">
      <SearchFormItem
        v-show="!(item.allowCollpase && collapsed)"
        :label="item.label"
      >
        <slot :name="item.slotName"></slot>
      </SearchFormItem>
    </template>
    <slot name="resetBtn">
      <el-link
        class="u-btn-refresh"
        v-show="showRestBtn"
        :underline="false"
        type="primary"
        @click="() => emit('reset')"
      >
        <el-icon><Refresh /></el-icon>
        <span>重置筛选条件</span>
      </el-link>
    </slot>
    <div class="u-collapse" v-show="collapseable" @click="clickCollpase">
      <el-icon v-if="collapsed"><ArrowDown /></el-icon>
      <el-icon v-else><ArrowUp /></el-icon>
    </div>
  </div>
</template>

<script setup name="SearchForm">
import SearchFormItem from './item.vue'

const props = defineProps({
  /**
   * list说明：[{ label, slotName, allowCollpase }]
   *   label: 表单项的名字
   *   slotName: 表单项组件插槽的名字
   *   allowCollpase: 是否允许折叠，默认为false，如果为true，则此表单项的显示隐藏受组件的collapsed属性控制
   */
  list: Array,
  // 是否显示折叠按钮
  collapseable: Boolean,
  // 是否被折叠，可以使用v-model传入此属性
  collapsed: {
    type: Boolean,
    default: false,
  },
  // 是否显示重置按钮，也可以使用 v-slot="resetBtn" 插槽来自定义
  showRestBtn: {
    type: Boolean,
    default: true,
  },
})

// 抛出事件
const emit = defineEmits(['update:collapsed', 'reset'])

function clickCollpase() {
  emit('update:collapsed', !props.collapsed)
}
</script>

<style lang="scss" scoped>
.p-search-form {
  position: relative;
  .u-row,
  .u-btn-refresh {
    padding: 8px 0;
    line-height: 32px;
  }
  .u-row {
    display: flex;
    .u-right {
      flex: 1;
    }
  }
  .u-btn-refresh {
    position: absolute;
    right: 0;
    bottom: 0;
  }
  .u-collapse {
    position: absolute;
    left: 50%;
    bottom: -26px;
    margin-left: -46px;
    width: 93px;
    height: 27px;
    line-height: 27px;
    text-align: center;
    color: #999;
    background-color: #fff;
    border-radius: 0 0 14px 14px;
    cursor: pointer;
    &:hover {
      color: var(--el-color-primary);
    }
  }
}
</style>
